﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace BSC_OTC_Management.Forms
{
    public partial class Frm_Group_Permission : Form
    {
        #region Khai báo biến
        Code.StaticVariable _code = new Code.StaticVariable();
        DataTable _tableTreeGroup = new DataTable();
        DataTable _tableTreeMenu = new DataTable();
        DataTable _tablePermission = new DataTable();
        DataTable _tableValue = new DataTable("value");
        string _CurrentSelectNote = "";
        #endregion

        public Frm_Group_Permission()
        {
            InitializeComponent();
            LoadTreeGroup();
            this.dgv.CellFormatting += new DataGridViewCellFormattingEventHandler(dgv_CellFormatting);
            this.treeGroup.AfterSelect += new TreeViewEventHandler(treeGroup_AfterSelect);
            this.treePer.AfterCheck += new TreeViewEventHandler(treePer_AfterCheck);
        }

        #region code

        // loa menu nhóm bên trái
        private void LoadTreeGroup()
        {
            this._tableTreeGroup = _code._services.GetData_AllGroups();
            ShowAllGroup();
        }

        // hiên thị menu quyen ben phải
        private void LoadTreeMenu(string _e)
        {
            this.treePer.Nodes.Clear();
            this._tableTreeMenu = _code._services.GetMenuLeft();
            this._tablePermission = _code._services.GetMenu_ByGroupPermission(_e);
            ShowMenuPermission();
            ShowHide_Permission_OnTreeMenu(this.treePer.Nodes);
        }

        private void ShowHide_Permission_OnTreeMenu(TreeNodeCollection nodes)
        {
            foreach (TreeNode child in nodes)
            {
                foreach (DataRow row in this._tablePermission.Rows)
                {
                    if (row["MENUID"].ToString() == child.Name)
                    {
                        child.Tag = row["autoid"].ToString();
                        child.Checked = true;
                        // Hiện tại, 
                        //chỉ sử dụng 6 ký tự đầu theo thứ tự quyền 
                        //thêm mới, xem, sửa, xoá, tìm kiếm và kết xuất. 
                        //if (row["authcode"].ToString() != "")
                        //{
                        //    char[] authcode = row["authcode"].ToString().ToCharArray();
                        //    for (int i = 0; i < authcode.Length; i++)
                        //    {
                        //        switch (i)
                        //        {
                        //            case 0:
                        //                if (authcode[i] == 'Y')
                        //                {
                        //                    child.Text += @" Thêm -";
                        //                }
                        //                break;
                        //            case 1:
                        //                if (authcode[i] == 'Y')
                        //                {
                        //                    child.Text += @" Xem-";
                        //                }
                        //                break;
                        //            case 2:
                        //                if (authcode[i] == 'Y')
                        //                {
                        //                    child.Text += @" Sửa-";
                        //                }
                        //                break;
                        //            case 3:
                        //                if (authcode[i] == 'Y')
                        //                {
                        //                    child.Text += @" Xóa-";
                        //                }
                        //                break;
                        //            case 4:
                        //                if (authcode[i] == 'Y')
                        //                {
                        //                    child.Text += @" Tìm kiếm-";
                        //                }
                        //                break;
                        //            case 5:
                        //                if (authcode[i] == 'Y')
                        //                {
                        //                    child.Text += @" Kết Xuất-";
                        //                }
                        //                break;
                        //            default:
                        //                break;
                        //        }
                        //    }    
                        //}
                    }
                }
                ShowHide_Permission_OnTreeMenu(child.Nodes);
            }
        }

        // hiện menu tương ứng quyền
        private void ShowMenuPermission()
        {
            DataView dv = new DataView(_tableTreeMenu);
            dv.RowFilter = "MenuParentID = 0";
            foreach (DataRowView row in dv)
            {
                this.treePer.Nodes.Add(row["MenuID"].ToString(), row["MenuFullName"].ToString());
                AddChildMenuItems(_tableTreeMenu, this.treePer.Nodes[row["MenuID"].ToString()]);
            }
        }

        // Add cac menu con cấp dưới
        private void AddChildMenuItems(DataTable menuData, TreeNode nodeParent)
        {
            DataView view = new DataView(menuData);
            view.RowFilter = "MenuParentID = " + nodeParent.Name;
            foreach (DataRowView row in view)
            {
                nodeParent.Nodes.Add(row["MenuID"].ToString(), row["MenuFullName"].ToString());
                AddChildMenuItems(menuData, nodeParent.Nodes[row["MenuID"].ToString()]);
            }
        }

        // Add menu Cha
        private void ShowAllGroup()
        {
            this.treeGroup.Nodes.Add("NhomQuyen", "Nhóm quyền");
            foreach (DataRow row in this._tableTreeGroup.Rows)
            {
                this.treeGroup.Nodes[0].Nodes.Add(row["grpid"].ToString(), row["grpname"].ToString());
            }
            this.treeGroup.ExpandAll();
        }

        // hiện user theo group
        private void ShowUsersByGroup(DataTable table)
        {
            this.dgv.DataSource = table;
        }

        // check all các menu nếu Node cha đc check và ngc lại
        private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
        {
            foreach (TreeNode item in node.Nodes)
            {
                item.Checked = isChecked;
                if (item.Nodes.Count > 0)
                {
                    this.CheckTreeViewNode(item, isChecked);
                }
            }
        }

        // sau khi ấn Cập nhập quyền, căn cứ vào các node đc check để gán quyền
        private void UpdatePermission(TreeNodeCollection nodes)
        {
            // kiểm tra từng menu
            foreach (TreeNode child in nodes)
            {
                // Nếu menu đc check, kiểm tra nếu chưa có trong db thi insert vào
                bool check = false;
                foreach (DataRow row in this._tablePermission.Rows)
                {
                    if (row["MENUID"].ToString() == child.Name)
                    {
                        check = true;
                        break;
                    }
                }
                if (child.Checked)
                {
                    if (check == false)
                    {
                        this._tableValue = new DataTable("noname");
                        this._tableValue.Columns.Add("grpid");
                        this._tableValue.Columns.Add("menuid");
                        this._tableValue.Rows.Clear();
                        DataRow newRow = this._tableValue.NewRow();
                        newRow["grpid"] = this.treeGroup.SelectedNode.Name;
                        newRow["menuid"] = child.Name;
                        this._tableValue.Rows.Add(newRow);

                        DataRow dataTypeRow = this._tableValue.NewRow();
                        dataTypeRow["grpid"] = "T";
                        dataTypeRow["menuid"] = "T";
                        this._tableValue.Rows.Add(dataTypeRow);

                        this._code._services.AddNewRow("BSC_GROUP_PERMISSION",
                                                        this._tableValue);
                    }
                }
                // nếu Menu đó ko dc check, kiểm tra với  quyền hiện tại , nếu thỏa mãn thì bỏ quyền này đi
                else
                {
                    if (check == true)
                    {
                        foreach (DataRow row in this._tablePermission.Rows)
                        {
                            if (row["menuid"].ToString() == child.Name && row["grpid"].ToString() == this.treeGroup.SelectedNode.Name)
                            {
                                this._code._services.DeleteRow("BSC_GROUP_PERMISSION", row["autoid"].ToString(), "AUTOID", Code.StaticVariable.userID);
                                break;
                            }
                        }
                    }
                }
                UpdatePermission(child.Nodes);
            }
        }

        #endregion

        #region Events

        // ấn vào nút cập nhập
        private void btnUpdate_Click(object sender, EventArgs e)
        {
            this.UpdatePermission(this.treePer.Nodes);
            this.LoadTreeMenu(this._CurrentSelectNote);
            MessageBox.Show(Code.StaticVariable.messeseboxSuaThanhCong, "Lưu thành công");
        }

        // sự kiện check vào 1 node menu
        void treePer_AfterCheck(object sender, TreeViewEventArgs e)
        {
            //CheckTreeViewNode(e.Node, e.Node.Checked);
        }

        // sự kiện click vào 1 nhóm
        void treeGroup_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Level == 1)
            {
                DataTable table = new DataTable("noname");
                table = this._code._services.Get_UsersByGroup(e.Node.Name);
                this.ShowUsersByGroup(table);
                this.lblTop.Text = e.Node.Text;
                this.LoadTreeMenu(e.Node.Name);
                this._CurrentSelectNote = e.Node.Name;
            }
        }

        // làm màu cho gridview
        void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.RowIndex % 2 == 0)
            {
                e.CellStyle.BackColor = Color.FromArgb(195, 231, 195);
            }
            else
            {
                e.CellStyle.BackColor = Color.FromArgb(253, 240, 208);
            }
        }

        private void sửaQuyềnToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                Frm_EditPermission _frm = new Frm_EditPermission(this.treePer.SelectedNode.Tag.ToString());
                _frm.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Bạn phải lưu cập nhập trước khi chỉnh sửa");
            }
            
        }

        private void treePer_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            ((TreeView)sender).SelectedNode = e.Node;
        }

        #endregion
    }
}
